using System.Text;

namespace Tool
{
    public static partial class ExtensionHelper
    {
        #region IpToLong IP 转换为 long

        /// <summary>
        /// IP 转换为 long
        /// </summary>
        /// <param name="ip"></param>
        /// <returns></returns>
        public static long IpToLong(this string ip)
        {
            char[] separator = new char[] { '.' };
            string[] items = ip.Split(separator);

            return long.Parse(items[0]) << 24

                    | long.Parse(items[1]) << 16

                    | long.Parse(items[2]) << 8

                    | long.Parse(items[3]);
        }

        #endregion IpToLong IP 转换为 long

        #region LongToIP 数字转换为IP

        /// <summary>
        /// 数字转换为IP
        /// </summary>
        /// <param name="ipInt"></param>
        /// <returns></returns>
        public static string LongToIP(this long ipInt)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append((ipInt >> 24) & 0xFF).Append(".");
            sb.Append((ipInt >> 16) & 0xFF).Append(".");
            sb.Append((ipInt >> 8) & 0xFF).Append(".");
            sb.Append(ipInt & 0xFF);
            return sb.ToString();
        }

        #endregion LongToIP 数字转换为IP

        //IPV6 https://blog.csdn.net/qq_29229567/article/details/88739294

        //       /**
        //* 将 IPv6 地址转为 long 数组，只支持冒分十六进制表示法
        //*/
        //       public static long[] ipv6ToLongs(String ipv6_string)
        //       {
        //           if (string.IsNullOrWhiteSpace(ipv6_string))
        //           {
        //              // throw new IllegalArgumentException("ipv6_string cannot be null.");
        //              throw new Exception("ipv6_string cannot be null.");
        //           }

        //           String[] ipSlices = ipv6_string.Split(":");
        //           if (ipSlices.Length != 8)
        //           {
        //               //throw new IllegalArgumentException(ipv6_string + " is not an ipv6 address.");
        //               throw new Exception(ipv6_string + " is not an ipv6 address.");
        //           }

        //           long[] ipv6 = new long[2];
        //           for (int i = 0; i < 8; i++)
        //           {
        //               String slice = ipSlices[i];

        //               // 以 16 进制解析
        //               //long num = Long.parseLong(slice, 16);
        //               long num = Convert.ToInt64(slice);

        //               // 每组 16 位
        //               long right = num << (16 * i);

        //               // 每个 long 保存四组，i >> 2 等于 i / 4
        //               int length = i >> 2;//即int length=i / 4;
        //               ipv6[length] = ipv6[length] | right;
        //           }

        //           return ipv6;
        //       }

        //       /**
        //* 将 long 数组转为冒分十六进制表示法的 IPv6 地址
        //*/
        //       public static String longsToIpv6(long[] numbers)
        //       {
        //           if (numbers == null || numbers.Length != 2)
        //           {
        //               //throw new IllegalArgumentException(Arrays.toString(numbers) + " is not an IPv6 address.");
        //               throw new Exception(Arrays.toString(numbers) + " is not an IPv6 address.");
        //           }

        //           StringBuilder sb = new StringBuilder(32);
        //           for (long numSlice : numbers)
        //           {
        //               // 每个 long 保存四组
        //               for (int j = 0; j < 4; j++)
        //               {
        //                   // 取最后 16 位
        //                   long current = numSlice & 0xFFFF;
        //                   sb.append(Long.toString(current, 16)).append(":");
        //                   // 右移 16 位，即去除掉已经处理过的 16 位
        //                   numSlice >>= 16;
        //               }
        //           }

        //           // 去掉最后的 :
        //           return sb.ToString().Substring(0, sb.Length - 1);
        //       }
    }
}